/*
 * Created on 17-sep-2008
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package com.gestores;

import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.NamingException;

import com.beans.OfertaBean;
import com.beans.UsuarioBean;
import com.util.Conectar;
import com.util.Utils;

/**
 * @author vPalomo
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class GestionOfertas {
    //private static GestionOfertas instancia=null;
    
    private GestionOfertas() {} //Constructor privado, para que nadie pueda usarle
    
    public static GestionOfertas getInstance() {
//        if(instancia==null) {
//            instancia=new GestionOfertas();
//        }
//        return instancia;
        return new GestionOfertas();
    }
    /**
     * Crea la oferta que pasemos, comprobado si el usuario tiene o no permisos en la categoria de ofertas
     * @param oferta
     * @param usuario
     * @return
     */
    public boolean crear(OfertaBean oferta, UsuarioBean usuario) {
        if(!usuarioValido(usuario)){ 
            return false;
        }
        Connection connection = null;
        PreparedStatement insertStatement = null;
        boolean result=false;
        String insertStr = "INSERT INTO ofertas (titular, archivo, autor, fechaAlta, categoria, tipo, filearchivo) VALUES" +
                "(?,?,?,?,?,?,?)";
        try {
            connection = Conectar.getConnection();
            insertStatement = connection.prepareStatement(insertStr);
            insertStatement.setString(1, oferta.getTitular());
            insertStatement.setString(2, oferta.getArchivo());
            insertStatement.setString(3, oferta.getAutor());
            insertStatement.setString(4, Utils.fechaParaMysql(oferta.getFechaAlta()));
            insertStatement.setString(5, oferta.getCategoria());
            insertStatement.setString(6, oferta.getTipo());
            insertStatement.setString(7, oferta.getFileArchivo());
            insertStatement.executeUpdate();
            result=true;
        } catch (Exception e) {
            System.out.println(e.getMessage());
            
        }finally {
            try {
                if(insertStatement!=null)insertStatement.close();
                if(connection!=null)connection.close();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        return result;
    }
    
    /**
     * Consulta en la base de datos la oferta cuyo id es el que pasamos como parametro
     * @param id Id de la oferta que queremos consultar
     * @return La oferta con todos campos rellenos o null si la oferta no existe
     */
    public OfertaBean consultaOferta(String id) {
        Connection conexion=null;
        OfertaBean oferta=null;
        PreparedStatement selectStatement = null;
        try {
            conexion = Conectar.getConnection();
            String selectCustomerStr = "SELECT * FROM ofertas " +
                    "WHERE ofertas.idOferta = ?";
            
            selectStatement = (PreparedStatement) conexion.prepareStatement(selectCustomerStr);
            selectStatement.setString(1, id);
            ResultSet rs = selectStatement.executeQuery();
            System.out.println("se ha ejecutado la consulta");
            String aux = "";
            if (rs.next()) {
                oferta=new OfertaBean();
                oferta.setIdOferta(rs.getString(1));
                oferta.setTitular(rs.getString(2));
                oferta.setArchivo(rs.getString(3));
                oferta.setAutor(rs.getString(4));
                aux = Utils.fecha(rs.getString(5));
                oferta.setFechaAlta(aux);
                oferta.setCategoria(rs.getString(6));
                oferta.setTipo(rs.getString(7));
                oferta.setFileArchivo(rs.getString(9));
            }
            
        } catch (NamingException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }finally {
            try {
                if(selectStatement!=null)selectStatement.close();
                if(conexion!=null)conexion.close();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        return oferta;
    }
    /**
     * Elimina de la BD la oferta que pasemos, tambien borra su correspondiente archivo
     * @param idOferta
     * @param usuario
     * @return
     */
    public boolean eliminarOferta(String idOferta, UsuarioBean usuario) {
        if(!usuarioValido(usuario)){ 
            return false;
        }
        Connection conexion=null;
        OfertaBean oferta=null;
        boolean result=false;
        PreparedStatement updateStatement = null;
        
        try {
            oferta=consultaOferta(idOferta);
            borrarArchivo(oferta.getFileArchivo());
            conexion = Conectar.getConnection();
            String updateSQL = "DELETE from ofertas WHERE ofertas.idOferta = ?";
            updateStatement = (PreparedStatement) conexion.prepareStatement(updateSQL);
            updateStatement.setString(1, idOferta);
            updateStatement.executeUpdate();
            result=true;
        } catch (NamingException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }finally {
            try {
                if(updateStatement!=null)updateStatement.close();
                if(conexion!=null)conexion.close();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        return result;
    }
    /**
     * Modifica en la base de datos la oferta de empleo que le pasemos, si el usuaio que pasemos tiene
     * permisos, es decir, pertenece a la categoria y la oferta es suya.
     * @param oferta
     * @param usuario
     * @return true si se ha podico modificar y false si no sa ha podido por alguna circunstancia
     */
    public boolean modificar(OfertaBean oferta, UsuarioBean usuario) {
        if(!usuarioValido(usuario)){ 
            return false;
        }
        PreparedStatement updateStatement = null;
        Connection conexion=null;
        boolean result=false;
        try {
            conexion = Conectar.getConnection();
            String updateSQL = "UPDATE ofertas SET " +
                    " titular='" + oferta.getTitular() + "'";
            if (oferta.getArchivo() != null) {
                updateSQL += ",archivo='" + oferta.getArchivo() + "'";
            }
            
            updateSQL += ",tipo='" + oferta.getTipo() + "'";
            
            if (oferta.getArchivo() != null) {
                updateSQL += ",filearchivo='" + oferta.getFileArchivo() + "'";
            }
            updateSQL += " WHERE ofertas.idOferta = '" + oferta.getIdOferta() + "'";
            
            updateStatement = (PreparedStatement) conexion.prepareStatement(updateSQL);
            updateStatement.executeUpdate();
            
        } catch (NamingException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }finally {
            try {
                if(updateStatement!=null)updateStatement.close();
                if(conexion!=null)conexion.close();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        
        return result;
    }
    /**
     * Pone como historica la oferta en la BD o la quita de historica
     * @param estado Si va a true pone la oferta como historica, si va a false la saca del hiostorico
     * @return true si se hace la modificacion y false si no se ha podido realizar
     */
    public boolean ponerHistorica(String idOferta,boolean estado,UsuarioBean usuario) {
        if(!usuarioValido(usuario)){ 
            return false;
        }
        Connection conexion=null;
        boolean result=false;
        PreparedStatement updateStatement = null;
        OfertaBean oferta=this.consultaOferta(idOferta);
        if(!oferta.getAutor().equalsIgnoreCase(usuario.getNick())) {
            return false;  //Si el autor no es el usuario no puede hace la modificacion
        }
        String sEstado;
        if(estado){
            sEstado="SI";
        }else{
            sEstado="NO";
        }
        try {
            conexion = Conectar.getConnection();
            String updateSQL = "UPDATE ofertas SET " +
                    " historica=?  WHERE ofertas.idOferta = ?";
            updateStatement = (PreparedStatement) conexion.prepareStatement(updateSQL);
            updateStatement.setString(1, sEstado);
            updateStatement.setString(2, idOferta);
            updateStatement.executeUpdate();
            System.out.println(updateStatement.toString());
            updateStatement.close();
            conexion.close();
        } catch (NamingException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }finally {
            try {
                if(updateStatement!=null)updateStatement.close();
                if(conexion!=null)conexion.close();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        
        
        return result;
    }
    
    /**
     * Compueba si el usuario tiene permisos en el area indicada
     * @param usu
     * @param area
     * @return true si tiene permisos y false si no los tiene
     */
    private boolean usuarioValido(UsuarioBean usu) {
        if(!usu.categoriaValida("1")){ //El 1 indica que las oferas son la categoria 1, si fuese la 6 habria que cambiarlo
            System.out.println("[GestionOfertas.usuarioValido]El usuario "+usu.getNick()+ " esta intentado acceder a una categoria no valida");
            return false;
        }
        return true;
    }
    
    /**
     * Le pasamos el nombre de un archivo de una oferta y le borra 
     * fisicamente del disco.
     * @param name Nombre del archivo de oferta a borrar
     * @return true si se ha borrado, false si no se ha podido borrar.
     */
    public boolean borrarArchivo(String name) {
        String archivo = "/var/lib/tomcat5.5/webapps/archivos/ofertas/" + name;
        System.out.println("Borrando archivo: " + archivo);
        File f = new File(archivo);
        if (f.delete()) {
            return true;
        } else {
            return false;
        }
    }
    
}
